﻿Namespace Control
    Public Class Estoque
        Implements IControl(Of Model.Estoque)
        Implements IDisposable


        Public Function Excluir(entity As Model.Estoque) As Boolean Implements IControl(Of Model.Estoque).Excluir

        End Function

        Public Function ListaTudo() As IList(Of Model.Estoque) Implements IControl(Of Model.Estoque).ListaTudo

            'Dim est As New Model.EstoquePesquisa
            'Dim estoques As IList(Of Model.EstoquePesquisa)
            'estoques = est.ListaEstoque()

            Return Model.Estoque.FindAll()
        End Function

        Public Function ListaUm(entity As Model.Estoque) As Model.Estoque Implements IControl(Of Model.Estoque).ListaUm

        End Function

        Public Function Salvar(entity As Model.Estoque) As Boolean Implements IControl(Of Model.Estoque).Salvar
            entity.Save()
        End Function

        Public Function GetById(ByVal id As Integer) As Model.Estoque
            Return Model.Estoque.Find(id)
        End Function

        ''' <summary>
        ''' Lista de estoque filtrado por id do produto
        ''' </summary>
        ''' <param name="id">id produto</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetByIdProduto(ByVal id As Integer) As IList(Of Model.Estoque)

            'Dim Produto As New Model.Produto
            'Produto.cd_produto = id

            Return Model.Estoque.FindAllByProperty("cd_produto", id)

        End Function

        ''' <summary>
        ''' Lista o estoque agrupando por produto
        ''' </summary>
        ''' <returns>Lista de estoques por produto</returns>
        ''' <remarks>Por enquanto ta no linq, fazer no Model com NHibernate</remarks>
        Public Function ListaEstoqueProduto(Optional ByVal produto As String = "") As IList(Of Model.Estoque)
            Dim estoques As IList(Of Model.Estoque)
            Dim estoque As New Model.Estoque


            If Not String.IsNullOrEmpty(produto) Then
                estoques = estoque.GetByProdutoNome(produto)

            Else
                'estoques = Model.Estoque.FindAll()
                'Return estoque.ListaEstoque()
                estoques = estoque.ListaEstoque()
            End If

            ' LINQ para agrupar estoque por produto
            'Dim result As IList(Of Model.EstoquePesquisa2) = From e In estoques Group e By e.cd_produto, e.ProdutoNome Into Group _
            '     Select New Model.EstoquePesquisa2 With { _
            '         .cd_produto = cd_produto, _
            '         .produto_nome = ProdutoNome, _
            '         .quantidade = Group.Sum(Function(g) g.quantidade), _
            '         .reservado = Group.Sum(Function(g) g.reservado)}

            Dim result = From e In estoques Group e By e.cd_produto, e.ProdutoNome Into Group _
                 Select New Model.Estoque With { _
                     .cd_produto = cd_produto, _
                     .ProdutoNome = ProdutoNome, _
                     .quantidade = Group.Sum(Function(g) g.quantidade), _
                     .reservado = Group.Sum(Function(g) g.reservado)}

            Dim re As IList(Of Model.Estoque)
            re = result.ToList()

            Return re

        End Function

        Public Function ListaEstoqueProdutoLocal(ByVal cd_produto As Integer) As IList(Of Model.Estoque)

            Dim EstoqueLocal As New Model.Estoque

            Return EstoqueLocal.GetByProduto(cd_produto)

        End Function

        ''' <summary>
        ''' Entrada do estoque
        ''' Adiciona estoque na coluna quantidade
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function Adicionar() As Boolean

        End Function

        ''' <summary>
        ''' Saída do estoque
        ''' Baixa estoque da coluna quantidade e reservado
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function Baixar(ByVal Produto As Model.Produto) As Boolean
            Dim Estoque As Model.Estoque

            'Estoque.f()

        End Function

        ''' <summary>
        ''' Reserva do estoque
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks>Adiciona reserva de estoque na coluna reservado</remarks>
        Public Function Reservar() As Boolean

        End Function

        ''' <summary>
        ''' Estorna o estoque reservado
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks>Subtrai da coluna reservado</remarks>
        Public Function Estornar() As Boolean

        End Function

#Region "IDisposable Support"
        Private disposedValue As Boolean ' To detect redundant calls

        ' IDisposable
        Protected Overridable Sub Dispose(disposing As Boolean)
            If Not Me.disposedValue Then
                If disposing Then
                    ' TODO: dispose managed state (managed objects).
                End If

                ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
                ' TODO: set large fields to null.
            End If
            Me.disposedValue = True
        End Sub

        ' TODO: override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources.
        'Protected Overrides Sub Finalize()
        '    ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
        '    Dispose(False)
        '    MyBase.Finalize()
        'End Sub

        ' This code added by Visual Basic to correctly implement the disposable pattern.
        Public Sub Dispose() Implements IDisposable.Dispose
            ' Do not change this code.  Put cleanup code in Dispose(disposing As Boolean) above.
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub
#End Region

    End Class
End Namespace